package com.ingenio.siot.adapter;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Criterio;
import com.ingenio.siot.entity.CriterioIntervalo;
import com.ingenio.siot.entity.Estado;
import com.ingenio.siot.entity.TipoIntervalo;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

public class CriterioAdapter extends Adapter{
	
	public List<Criterio> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<Criterio> criterios = new ArrayList<Criterio>();
    	CriterioIntervaloAdapter cia = new CriterioIntervaloAdapter();
    	List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT * FROM criterios WHERE activo=1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		Criterio c = null;
    		
    		while(result.next()){
    			Integer id = result.getInt("IdCriterio");
    			String desc = result.getString("descCriterio");
    			String formula = result.getString("formula");
    			boolean criterioPublico = result.getBoolean("criterioPublico");
    			boolean activo = result.getBoolean("activo");
    			c = new Criterio(id, desc, formula, criterioPublico, activo); 
    			intervalos = cia.devolverIntervalosDelCriterio(c);
    			c.setIntervalos(intervalos);
    			criterios.add(c);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return criterios;
    }
	
	public Criterio devolverCriterio(Integer idCriterio) throws Exception{
		Connection conn = null;
		Criterio c = null;
		CriterioIntervaloAdapter cia = new CriterioIntervaloAdapter();
    	List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
		PreparedStatement stmt = null;
		try{
			conn = (Connection) abrirConexion();
			String query = "SELECT * FROM criterios WHERE IdCriterio=? and activo=1";
			stmt = (PreparedStatement) conn.prepareStatement(query);
			stmt.setInt(1, idCriterio);
			ResultSet result = stmt.executeQuery();
			if(result.next()){
				Integer id = result.getInt("IdCriterio");
				String desc = result.getString("descCriterio");
				String formula = result.getString("formula");
				boolean criterioPublico = result.getBoolean("criterioPublico");
				boolean activo = result.getBoolean("activo");
				c = new Criterio(id, desc, formula, criterioPublico, activo);
				intervalos = cia.devolverIntervalosDelCriterio(c);
				c.setIntervalos(intervalos);
			}
		}
		catch (Exception e){
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos", e);
		}
		finally{
			cerrarConexion(conn);
		}
		return c;
	}
	
	public Criterio devolverCriterioPublico() throws Exception{
		Connection conn = null;
		Criterio c = null;
		CriterioIntervaloAdapter cia = new CriterioIntervaloAdapter();
    	List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
		PreparedStatement stmt = null;
		try{
			conn = (Connection) abrirConexion();
			String query = "SELECT * FROM criterios WHERE activo=1 and criterioPublico=1";
			stmt = (PreparedStatement) conn.prepareStatement(query);
			ResultSet result = stmt.executeQuery();
			if(result.next()){
				Integer id = result.getInt("IdCriterio");
				String desc = result.getString("descCriterio");
				String formula = result.getString("formula");
				boolean criterioPublico = result.getBoolean("criterioPublico");
				boolean activo = result.getBoolean("activo");
				c = new Criterio(id, desc, formula, criterioPublico, activo);
				intervalos = cia.devolverIntervalosDelCriterio(c);
				c.setIntervalos(intervalos);
			}
		}
		catch (Exception e){
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos", e);
		}
		finally{
			cerrarConexion(conn);
		}
		return c;
	}
	
	public boolean actualizarCriterioPublico(Integer idCriterioPublico) throws Exception{
		Criterio c = null, cri = null;
		try{
			c = this.devolverCriterioPublico();
			c.setCriterioPublico(false);
			this.editarCriterio(c);
			cri = this.devolverCriterio(idCriterioPublico);
			cri.setCriterioPublico(true);
			this.editarCriterio(cri);
		}
		catch (Exception e){
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
//	public Criterio crearCriterio(Criterio cri) throws Exception{
//		Connection conn = null;
//		PreparedStatement stmt = null;
//		CriterioAdapter ca = new CriterioAdapter();
//		Criterio c = null;
//    	try {
//    		conn = (Connection) abrirConexion();
//    		String query ="INSERT INTO criterios(descCriterio,formula,activo) VALUES(?,?,?)";
//    		stmt = (PreparedStatement) conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
//    		stmt.setString(1,cri.getDescCriterio());
//    		stmt.setString(2,cri.getFormula());
//    		stmt.setBoolean(3,cri.isActivo());
//    		stmt.execute();
//    		ResultSet id = stmt.getGeneratedKeys();
//    		if (id.next()){
//    			c = ca.devolverCriterio(id.getInt(1));
//    		}
//    	}
//    	catch (Exception e) {
//			e.printStackTrace();
//			throw new Exception("Error al conectar con la base de datos.", e);
//		}
//    	finally{
//    		cerrarConexion(conn);
//    	}
//    	return c;
//	}
	
	public Integer crearCriterio(Criterio cri) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		CriterioIntervaloAdapter cia = new CriterioIntervaloAdapter();
    	try {
    		conn = (Connection) abrirConexion();
    		conn.setAutoCommit(false);
    		String query ="INSERT INTO criterios(descCriterio,formula,activo,criterioPublico) VALUES(?,?,?,?)";
    		stmt = (PreparedStatement) conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
    		stmt.setString(1,cri.getDescCriterio());
    		stmt.setString(2,cri.getFormula());
    		stmt.setBoolean(3,cri.isActivo());
    		stmt.setBoolean(4,cri.isCriterioPublico());
    		stmt.executeUpdate();
    		ResultSet generatedKeys = (ResultSet) stmt.getGeneratedKeys();
    		
    		if (generatedKeys.next()){
    			Integer idNewCriterio = generatedKeys.getInt(1);
    			List<CriterioIntervalo> intervalos = cri.getIntervalos();
    			boolean guardo = cia.guardarCriterioIntervalos(intervalos, idNewCriterio, conn);
    			if(guardo){
					conn.commit();
					return idNewCriterio;
				}else{
					conn.rollback();
					throw new Exception("Error al tratar de guardar criterio");
				}
    		}
    		return null;
    	}
    	catch (Exception e) {
    		conn.rollback();
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public void editarCriterio(Criterio cri) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
    		conn = (Connection) abrirConexion();
    		String query =	"UPDATE criterios " +
    						"SET descCriterio=?, activo=?, criterioPublico=? " +
    						"WHERE IdCriterio=?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setString(1,cri.getDescCriterio());
    		stmt.setBoolean(2,cri.isActivo());
    		stmt.setBoolean(3,cri.isCriterioPublico());
    		stmt.setInt(4, cri.getIdCriterio());
    		stmt.executeUpdate();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarCriterio(Integer idCriterio) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String query =  "UPDATE criterios SET activo=0 WHERE IdCriterio=?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setInt(1,idCriterio);
    		stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public static void main(String args[]) throws Exception {
		
		CriterioAdapter ca = new CriterioAdapter();
		Criterio c = new Criterio(null, "agusPrueba", "cantidadActual/cantidadPasada", true, true);
		List<CriterioIntervalo> intervalos = new ArrayList<CriterioIntervalo>();
		TipoIntervaloAdapter tia = new TipoIntervaloAdapter();
		TipoIntervalo ti = tia.devolverTipoIntervalo(1);
		EstadoAdapter ea = new EstadoAdapter();
		Estado e = ea.devolverEstado(3);
		CriterioIntervalo ci = new CriterioIntervalo(ti, c, e, 0.5,0.0);
		intervalos.add(ci);
		ti = tia.devolverTipoIntervalo(2);
		e = ea.devolverEstado(1);
		ci = new CriterioIntervalo(ti, c, e, 0.0, 0.5);
		intervalos.add(ci);
		
		c.setIntervalos(intervalos);
		
		ca.crearCriterio(c);
		
 	}
}
